package com.appspot.abcensys.server.DAO.JDO;

import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;

import javax.jdo.PersistenceManager;

import com.appspot.abcensys.server.PMF;
import com.appspot.abcensys.server.DAO.GebruikerInstellingDAO;
import com.appspot.abcensys.shared.GebruikerInstelling;

public class GebruikerInstellingDAO_JDO implements GebruikerInstellingDAO {

	/**
	 * Logger
	 */
	private final Logger log = Logger.getLogger(GebruikerInstellingDAO_JDO.class.getName());

	/**
	 * Slaat een GebruikerInstelling object op
	 * 
	 * @param GebruikerInstelling
	 *            met GebruikerInstelling object
	 * @return true wanneer gelukt, false wanneer niet
	 */
	public boolean addGebruikerInstelling(GebruikerInstelling gi) {
		boolean b = false;
		PersistenceManager pm = PMF.get().getPersistenceManager();
		try {
			pm.makePersistent(gi);
			b = true;
		} finally {
			pm.close();
		}

		log.info("addGebruikerInstelling(" + gi.toString() + ") | is opgeslagen: " + b);

		return b;
	}

	/**
	 * Haalt de GebruikerInstelling op van een Gebruiker
	 * 
	 * @param Long
	 *            gebruikerId met het id van de op te halen Gebruiker
	 * @return GebruikerInstelling en anders null
	 */
	@SuppressWarnings("unchecked")
	public GebruikerInstelling getGebruikerInstellingByEmail(String gebruikerEmail) {
		GebruikerInstelling g = null;

		PersistenceManager pm = PMF.get().getPersistenceManager();
		String query = "SELECT FROM " + GebruikerInstelling.class.getName() + " WHERE gebruikerEmail == \"" + gebruikerEmail + "\"";
		ArrayList<GebruikerInstelling> instellingen = new ArrayList<GebruikerInstelling>(pm.detachCopyAll((List<GebruikerInstelling>) pm.newQuery(query).execute()));

		instellingen.size();
		pm.close();

		if (instellingen != null && !instellingen.isEmpty()) {
			g = instellingen.get(0);
		} else {
			// Onbekend voor deze gebruiker, dus een alvast een nieuwe aanmaken.
			g = new GebruikerInstelling();
			g.setGebruikerEmail(gebruikerEmail);
			g.setEmailPerAfmelding(false);
			g.setEmailPerDag(false);
			g.setEmailPerWeek(false);
			g.setEmailPerMaand(false);

			this.addGebruikerInstelling(g);
		}

		log.info("getGebruikerInstellingByEmail(" + gebruikerEmail + ") | GebruikerInstelling: " + g.toString());

		return g;
	}

	/**
	 * Update een GebruikerInstelling Object
	 * 
	 * @param String
	 *            met het emailadres van de Gebruiker
	 * @param ArrayList
	 *            <Boolean> met de waarden voor de GebruikerInstelling
	 * @return true wanneer gelukt, false wanneer niet
	 */
	public boolean updateGebruikerInstelling(String gebruikerEmail, ArrayList<Boolean> instellingen) {
		boolean b = false;

		GebruikerInstelling g = this.getGebruikerInstellingByEmail(gebruikerEmail);

		g.setEmailPerAfmelding(instellingen.get(0));
		g.setEmailPerDag(instellingen.get(1));
		g.setEmailPerWeek(instellingen.get(2));
		g.setEmailPerMaand(instellingen.get(3));

		if (g.getClass() == GebruikerInstelling.class) {
			PersistenceManager pmWrite = PMF.get().getPersistenceManager();
			try {
				pmWrite.makePersistent(g);
				b = true;
			} finally {
				pmWrite.close();
			}
		}

		log.info("updateGebruikerInstelling(" + gebruikerEmail + ", " + instellingen + ") | Is gelukt: " + b);

		return b;
	}
}
